package com.fingard.dsp.bank.directbank.mybank01;

import java.math.BigDecimal;
import java.util.Date;

import com.fingard.constant.Format;
import com.fingard.dsp.bank.directbank.bankInterface.IBalance;
import com.fingard.dsp.bank.reqrespobj.balance.Req7505HisBalQry;
import com.fingard.dsp.bank.reqrespobj.balance.Req7506BalQry;
import com.fingard.dsp.bank.reqrespobj.balance.RetAts7505HisBalQry;
import com.fingard.dsp.bank.reqrespobj.balance.RetAts7506BalQry;
import com.fingard.dsp.bank.reqrespobj.balance.detail.RetAtsBalDetail;
import com.fingard.text.StringHelper;
import com.fingard.xml.XmlTextReader;
import com.fingard.xml.XmlTextWriter;

/**
 * Created by Ross on 2017-06-06.
 * 网商银行
 */
public class MYBank01Balance extends MYBank01Base implements IBalance {

    //单个余额查询和批量余额查询，统一采用流处理方式
    //1、循环调用Req7506BalQry.readRecord()读取一个请求明细，然后写入发银行的XML对象
    //2、发银行
    //3、循环调用XmlTextReader.read()读取一个银行返回节点，赋值返回ATS的明细对象，
    //   然后调用RetAts7506BalQry.writeRetDetail()，写入返回ATS的明细
    public RetAts7506BalQry d_7506_BalQry(Req7506BalQry p_req7506) throws Exception {//余额查询
        //余额查询返回ATS的对象
        RetAts7506BalQry retAts = new RetAts7506BalQry(p_req7506.reqHeader);
        retAts.writeStart();//写返回ATS的统一头部信息
        try {
            //赋值通用参数
            MYBank01Header bankHeader = new MYBank01Header();
            bankHeader.function = "ant.ebank.acount.balance.query";
            bankHeader.signFields = "cardNo,currencyCode,cashExCode";
            bankHeader.signValueField="sign";
            while (p_req7506.readRecord()) {
                RetAtsBalDetail tmpRetDetail = new RetAtsBalDetail();
                tmpRetDetail.actNum = p_req7506.readedDetail.actNum;
                XmlTextWriter xmlWriter = new XmlTextWriter();//发银行报文的XML对象
                //写入通用的头部节点

                Date tmpDateNow = new Date();
                bankHeader.reqMsgID = Format.DateTime17Format.format(tmpDateNow);
                bankHeader.reqTime=tmpDateNow;

                writeCommonHeader(xmlWriter, bankHeader);
                xmlWriter.writeStartElement("body");
                xmlWriter.writeElementString("partner", bankFront.operator);
                xmlWriter.writeElementString("cardNo", p_req7506.readedDetail.actNum);
                xmlWriter.writeElementString("currencyCode", "156");
                xmlWriter.writeElementString("cashExCode", "CSH");
                xmlWriter.writeElementString("sign", "");
                xmlWriter.writeEndElement();
                xmlWriter.writeEndDocument();

                String[] tmpStrRet = sendToBank(xmlWriter.toXmlString(),bankHeader);
                if(tmpStrRet[0].length() == 0){
                    StringBuilder tmpSbMsg = new StringBuilder();
                    XmlTextReader tmpBkReader = loadBankRespXmlReader(tmpStrRet[1], tmpSbMsg);
                    if(tmpBkReader != null){
                        String tmpRetCode = tmpBkReader.getFirstText("/document/response/body/resultInfo/resultStatus");
                        String tmpRetInfo = tmpBkReader.getFirstText("/document/response/body/resultInfo/resultMsg");
                        if(tmpRetCode != null && tmpRetCode.equals("S")){
                            if(tmpBkReader.read("/document/response/body")){
                                tmpRetDetail.respCode = "0";
                                tmpRetDetail.actCur = p_req7506.readedDetail.actCur;
                                BigDecimal curUnit=new BigDecimal(100);
                                BigDecimal currBal=new BigDecimal(tmpBkReader.readedXElement.getSingleText("actualBalance"));
                                tmpRetDetail.currBal = currBal.divide(curUnit).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
                                BigDecimal availBal=new BigDecimal(tmpBkReader.readedXElement.getSingleText("availableBalance"));
                                tmpRetDetail.availBal =availBal.divide(curUnit).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
                                if(StringHelper.isNullOrEmpty(tmpRetDetail.availBal)){
                                    tmpRetDetail.availBal = tmpRetDetail.currBal;
                                }
                                BigDecimal frozenBal=new BigDecimal(tmpBkReader.readedXElement.getSingleText("freezeAmount"));
                                tmpRetDetail.frozenBal=frozenBal.divide(curUnit).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
                            }
                        }
                        else{
                            tmpRetDetail.respCode = "-1";
                            tmpRetDetail.respInfo = tmpRetInfo;
                        }
                    }
                    else{
                        tmpRetDetail.respCode = "-1";
                        tmpRetDetail.respInfo = tmpSbMsg.toString();
                    }
                }
                else{
                    tmpRetDetail.respCode = "-1";
                    tmpRetDetail.respInfo = tmpStrRet[1];
                }
                retAts.writeRetDetail(tmpRetDetail, p_req7506.isBatch);
            }
        } catch (Exception e) {
            retAts.writeRespCode("-1");
            retAts.writeRespInfo(e.getMessage());
            e.printStackTrace();
        }
        retAts.writeEnd();
        return retAts;
    }

    @Override
    public RetAts7505HisBalQry d_7505_BalQry(Req7505HisBalQry p_req7505) throws Exception {
        return null;
    }
}
